#include"udp_server.hpp"
#include<string>
#include<cstdlib>
#include<memory>

using namespace std;
using namespace ns_server;

static void usage(string proc)
{
    std::cout<<"Usage\n\t"<<proc<<"port\n"<<std::endl;
}

//上层的业务处理，不关心网络发送，只负责信息处理即可
std::string transactionString(std::string request) //request就是一个string
{
    std::string result;
    char c;
    for(auto &r:request)
    {
        if(islower(r))
        {
            c=toupper(r);
            result.push_back(c);
        }
        else{
            result.push_back(r);
        }
    }
    return result;
}

//防止客户端把服务端这边的东西删除了
static bool isPass(const std::string &command)
{   
    bool pass = true;
    auto pos = command.find("rm");
    if(pos != std::string::npos) pass=false;
    pos = command.find("mv");
    if(pos != std::string::npos) pass=false;
    pos = command.find("while");
    if(pos != std::string::npos) pass=false;
    pos = command.find("kill");
    if(pos != std::string::npos) pass=false;
    return pass;
}


// 让别人，在他的本地把命令给我，server再把结果给你！
// ls -a -l
std::string excuteCommand(std::string command) //command是一个命名
{
    //1、安全检测
    if(!isPass(command)) return "SB,别想了，你删不掉的！";

    //2、业务逻辑处理
    FILE*fp=popen(command.c_str(),"r");
    if(fp==nullptr) return "none";
    
    //3、获取结果
    char line[11024];
    std::string result;
    while(fgets(line,sizeof(line),fp)!=nullptr)
    {
        result+=line;
    }

    pclose(fp);
    return result;

}

// ./ude_server port
int main(int argc,char*argv[])
{
    if(argc!=2)
    {
        usage(argv[0]);
        exit(USAGE_ERR);
    }
    uint16_t port=atoi(argv[1]);
    // unique_ptr<UdpServer> usvr(new UdpServer("120.78.126.148", 8082));
    // unique_ptr<UdpServer> usvr(new UdpServer(transactionString, port));
    // unique_ptr<UdpServer> usvr(new UdpServer(excuteCommand, port));
    unique_ptr<UdpServer> usvr(new UdpServer(port));

    usvr->start();
    return 0;
}